#include <string>
#include <vector>

using namespace std;

/**
 * leetcode #6
 * Z字符串
 * 按照从上到下、然后从下到右上（即斜向上）的顺序反复排列，形成Z字形图案，最后按行从左到右读取字符得到转换后的字符串。
 *
 * ex:
 * 字符串"PAYPALISHIRING"  行数:3
 * P        A       H       N
 * A    P   L   S   I   I   G
 * Y        I       R
 * 输出"PINALSIGYAHRPI"   周期长度是：4 中间两个，上下各一个
 * 
 * 规律:
 * 1.每一行字符在原字符串中的索引是有规律的
 * 2.整个排列可以看作由若干个“周期”组成，每个周期的字符数是：周期长度 = 2 * numRows - 2（当numRows>1时，如果numRows==1，则周期为1，因为不需要走斜线）。
 * 3.在一个周期内，第一行和最后一行只有一个字符，中间的行有两个字符（一个在竖列，一个在斜线上）。
 * 假如
 * P            I           N
 * A        L   S       I   G
 * Y    A       H   R
 * P            I
 * 周期长度是6
 */     
// 0,1,2,3,2,1,0,1,2,3,2,1
namespace S1 {
class Solution {
public:
    // 
    // 给定一个字符串和一个行数
    string convert(string s, int numRows) {
        if (numRows <= 1)  {
            return s;
        }
        vector<string> rows(min(numRows, int(s.size())));
        int currentRow = 0;
        bool goingDown = false;  // + 1 或者 -1

        // 周期长度
        int cycleLen = 2 * numRows - 2;
        for (char c : s) {
            rows[currentRow] += c;

            if (currentRow == 0 || currentRow == numRows - 1) {
                goingDown = !goingDown;
            }
            currentRow += goingDown ? 1 : -1;
        }

        string result;
        for(string str : rows) {
            result += str;
        }
        return result;
    }
};
}

int main() {

}